/* 
      防抖函数:
        在指定时间内重复触发会重置计时器时间,直到不重复触发为止
      理解,执行流程:
        流程一: timer == null 则不执行停止计时器,进行赋值,并开启计时器
        流程二: timer == 计时器,则停止计时器,然后下一步,重新赋值,重新开始计时器
        然后流程重复流程二
        最后一步: 停止上一个计时器,然后重新赋值,开启计时器,并运行新计时器,由于没有新的流程去停止计时器,所以直接执行完毕计时器内的内容
      
      节流函数:
        在指定时间内只能触发一次事件函数,如验证码发送之后,60秒内不能再点击发送验证按钮
    */
export function debounce(func, delay) {
  let timer = null
  return function(...args) {
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
      func.apply(this, args)
    }, delay)
  }
}

//日期处理工具
export function formatDate(date, fmt) {
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(
      RegExp.$1,
      (date.getFullYear() + '').substr(4 - RegExp.$1.length)
    )
  }
  let o = {
    'M+': date.getMonth() + 1,
    'd+': date.getDate(),
    'h+': date.getHours(),
    'm+': date.getMinutes(),
    's+': date.getSeconds()
  }
  for (let k in o) {
    if (new RegExp(`(${k})`).test(fmt)) {
      let str = o[k] + ''
      fmt = fmt.replace(
        RegExp.$1,
        RegExp.$1.length === 1 ? str : padLeftZero(str)
      )
    }
  }
  return fmt
}

function padLeftZero(str) {
  return ('00' + str).substr(str.length)
}
